home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ICMPDUMP.C < prev    next >
Text File  |  1990-06-06  |  2KB  |  78 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "icmp.h"
  6. #include "trace.h"
  7.  
  8. extern FILE *trfp;
  9.  
  10. /* Dump an ICMP header */
  11. void
  12. icmp_dump(bpp,source,dest,check)
  13. struct mbuf **bpp;
  14. int32 source,dest;
  15. int check;        /* If 0, bypass checksum verify */
  16. {
  17.     struct icmp icmp;
  18.     int16 csum;
  19.  
  20.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  21.         return;
  22.     csum = cksum(NULLHEADER,*bpp,len_mbuf(*bpp));
  23.     
  24.     ntohicmp(&icmp,bpp);
  25.     
  26.     if(uchar(icmp.type) <= 16 && icmptypes[uchar(icmp.type)] != NULLCHAR)
  27.         fprintf(trfp,"ICMP: %s",icmptypes[uchar(icmp.type)]);
  28.     else
  29.         fprintf(trfp,"ICMP: type %u",uchar(icmp.type));
  30.  
  31.     switch(uchar(icmp.type)){
  32.     case DEST_UNREACH:
  33.         if(uchar(icmp.code) <= 5)
  34.             fprintf(trfp," %s",unreach[uchar(icmp.code)]);
  35.         else
  36.             fprintf(trfp," code %u",uchar(icmp.code));
  37.         break;
  38.     case REDIRECT:
  39.         if(uchar(icmp.code) <= 3)
  40.             fprintf(trfp," %s",redirect[uchar(icmp.code)]);
  41.         else
  42.             fprintf(trfp," code %u",uchar(icmp.code));
  43.         break;
  44.     case TIME_EXCEED:
  45.         if(uchar(icmp.code) <= 1)
  46.             fprintf(trfp," %s",exceed[uchar(icmp.code)]);
  47.         else
  48.             fprintf(trfp," code %u",uchar(icmp.code));
  49.         break;
  50.     case PARAM_PROB:
  51.         fprintf(trfp," pointer = %u",icmp.args.pointer);
  52.         break;
  53.     case ECHO_REQ:
  54.     case ECHO_REPLY:
  55.     case INFO_RQST:
  56.     case INFO_REPLY:
  57.     case TIMESTAMP:
  58.     case TIME_REPLY:
  59.         fprintf(trfp," id %u seq %u",icmp.args.echo.id,icmp.args.echo.seq);
  60.         break;
  61.     }
  62.     if(check && csum != 0){
  63.         fprintf(trfp," CHECKSUM ERROR (%u)",csum);
  64.     }
  65.     fprintf(trfp,"\n");
  66.     /* Dump the offending IP header, if any */
  67.     switch(icmp.type){
  68.     case DEST_UNREACH:
  69.     case TIME_EXCEED:
  70.     case PARAM_PROB:
  71.     case QUENCH:
  72.     case REDIRECT:
  73.         fprintf(trfp,"Returned ");
  74.         ip_dump(bpp,0);
  75.     }
  76. }
  77.  
  78. ə